package com.lizhi.menu.common.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author lizhi
 */
public class Md5Util {


    /**
     * 获取字段MD5加密后的数据
     *
     * @param payPassword
     * @return
     * @throws Exception
     */
    public static String getMd5Str(String payPassword) {
        MessageDigest md = null;
        try {
            //暂定MD5加密，还不知道他们的卡扣加密方式，以后再改逻辑

            try {
                md = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                throw new Exception("加密密码失败");
            }
            // 计算md5函数
            md.update((payPassword).getBytes());
            // digest()最后确定返回md5 hash值，返回值为8位字符串。因为md5 hash值是16位的hex值，实际上就是8位的字符
            // BigInteger函数则将8位的字符串转换成16位hex值，用字符串来表示；得到字符串形式的hash值
            //一个byte是八位二进制，也就是2位十六进制字符（2的8次方等于16的2次方）

        } catch (Exception e) {
            e.printStackTrace();
        }
        return bytesToHexString(md.digest());
    }


    public static String getMd5StrToUpper(String payPassword) throws Exception {
        //暂定MD5加密，还不知道他们的卡扣加密方式，以后再改逻辑
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new Exception("加密密码失败");
        }
        // 计算md5函数
        md.update((payPassword.toUpperCase()).getBytes());
        // digest()最后确定返回md5 hash值，返回值为8位字符串。因为md5 hash值是16位的hex值，实际上就是8位的字符
        // BigInteger函数则将8位的字符串转换成16位hex值，用字符串来表示；得到字符串形式的hash值
        //一个byte是八位二进制，也就是2位十六进制字符（2的8次方等于16的2次方）
        String md5Str = bytesToHexString(md.digest());
        return md5Str.toUpperCase();
    }


    /**
     * Convert byte[] to hex string.这里我们可以将byte转换成int，
     * 然后利用Integer.toHexString(int)来转换成16进制字符串。
     *
     * @param src byte[] data
     * @return hex string
     */
    public static String bytesToHexString(byte[] src) {
        if (src == null || src.length <= 0) {
            return null;
        }
        StringBuilder sb = new StringBuilder(src.length * 2);
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                sb.append(0);
            }
            sb.append(hv);
        }
        return sb.toString();
    }
}
